/**
 * Coze WebSocket连接工具
 * 处理WebSocket URL构建和签名验证
 */

/**
 * 生成ISO格式的日期字符串
 * @returns {string} ISO格式的日期字符串
 */
function generateISODate() {
    const now = new Date();
    return now.toISOString();
}

/**
 * 构建签名原始字符串（signature_origin）
 * @param {string} botId - 机器人ID
 * @param {string} token - 访问令牌
 * @param {string} date - 原始日期字符串（非编码）
 * @returns {string} 签名原始字符串
 */
function buildSignatureOrigin(botId, token, date) {
    // signature_origin中的date使用原始的非encode格式
    return `bot_id=${botId}&authorization=Bearer ${token}&date=${date}`;
}

/**
 * 构建Coze WebSocket连接URL
 * @param {string} botId - 机器人ID
 * @param {string} token - 访问令牌
 * @returns {string} 完整的WebSocket URL
 */
export function buildCozeWebSocketUrl(botId, token) {
    // 生成当前时间戳（原始格式，用于signature_origin）
    const date = generateISODate();

    // 构建签名原始字符串（signature_origin）
    const signatureOrigin = buildSignatureOrigin(botId, token, date);

    // 构建URL参数（最外层URL中的date需要encodeURIComponent）
    const urlParams = {
        bot_id: encodeURIComponent(botId),
        authorization: encodeURIComponent(`Bearer ${token}`),
        date: encodeURIComponent(date), // URL中的date需要encodeURIComponent
    };

    // 构建查询字符串
    const queryString = Object.entries(urlParams)
        .map(([key, value]) => `${key}=${value}`)
        .join('&');

    const fullUrl = `wss://ws.coze.cn/v1/chat?${queryString}`;

    // 返回完整的WebSocket URL
    return fullUrl;
}

/**
 * 验证WebSocket连接状态
 * @param {Object} ws - WebSocket实例
 * @returns {boolean} 连接是否正常
 */
export function isWebSocketConnected(ws) {
    return ws && ws.readyState === 1; // WebSocket.OPEN
}

/**
 * 安全关闭WebSocket连接
 * @param {Object} ws - WebSocket实例
 */
export function safeCloseWebSocket(ws) {
    if (ws && ws.readyState !== 3) {
        // 不是CLOSED状态
        try {
            ws.close();
        } catch (error) {
            console.error('关闭WebSocket连接时出错:', error);
        }
    }
}
